class Solution:
    def maxValue(self, n: int, index: int, maxSum: int) -> int:
        # 计算将所有填为1之后剩余的和
        maxSum -= n

        # 计算最大化坐标到左右的距离
        d1 = index
        d2 = n - index - 1
        if d1 > d2:
            d1, d2 = d2, d1

        # 计算实现两侧顶满的尖峰所需要的和
        peak = (0 + d2) * (d2 + 1) // 2 + ((d2 - d1) + d2) * (d1 + 1) // 2 - d2  # 两个等差数列减被共用的最大值

        # 处理剩余可以组成尖峰的情况：尽可能组成尖峰，其余的平均分布
        if maxSum >= peak:
            # print("距离:", [d1, d2], "剩余:", maxSum, "尖峰需要:", peak)
            return 1 + d2 + (maxSum - peak) // n

        # print("距离:", [d1, d2], "剩余:", maxSum)

        # 不足以组成尖峰的情况：二分查找最大值
        left, right = 0, d2
        while left < right:
            mid = (left + right) // 2
            need = (0 + mid) * (mid + 1) // 2 + ((mid - min(mid, d1)) + mid) * (min(mid, d1) + 1) // 2 - mid
            # print(left, right, "->", mid, "=", need)
            if need <= maxSum:
                left = mid + 1
            else:
                right = mid

        return 1 + (left - 1)


if __name__ == "__main__":
    print(Solution().maxValue(4, 2, 6))  # 2
    print(Solution().maxValue(6, 1, 10))  # 3

    # 自制用例
    print(Solution().maxValue(4, 2, 4))  # 1
    print(Solution().maxValue(4, 2, 10))  # 3

    # 测试用例:226/370
    print(Solution().maxValue(2, 1, 21))  # 11
